package bd;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

import negocios.Chat;
import negocios.Convite;
import negocios.Mensagem;
import negocios.MensagemTexto;
import negocios.SMS;

/**
 * Classe que manipula o log do sistema, o historico de envio de mensagens do
 * Sistema. Implementa o padrao Singleton.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class EditorHistorico {
	private static final String SEP = System.getProperty("file.separator");
	private static final String ENDL = System.getProperty("line.separator");
	private static final String SUFIXO_LOG = ".log";
	private static final String SEPARADOR = "***************************************************************************************************";
	private static final String PATH_CHATS = "chats" + SEP;
	private static final String PATH_EMAILS = "emails" + SUFIXO_LOG;
	private static final String PATH_SMS = "sms" + SUFIXO_LOG;
	private static final String PATH_CONVITES = "convites" + SUFIXO_LOG;

	private static EditorHistorico instance;
	private String pathLog;

	private EditorHistorico() {
		pathLog = "db" + SEP + "logs" + SEP;
	}

	/**
	 * Retorna a instancia unica do editor
	 * 
	 * @return a instancia unica do editor
	 */
	public static synchronized EditorHistorico getInstance() {
		if (instance == null) {
			instance = new EditorHistorico();
		}
		return instance;
	}

	/**
	 * Faz o log duma mensagem no caminho passado como parametro
	 * 
	 * @param m
	 *            a mensagem a ser guardada no historico
	 * @param caminho
	 *            o caminho do log
	 * @throws IOException
	 *             caso o log nao seja encontrado
	 */
	private void logMensagem(Mensagem m, String caminho) throws IOException {
		File arq = new File(caminho);
		if (!arq.exists()) {
			arq.createNewFile();
		}
		FileWriter escritor = new FileWriter(arq, true);
		escritor.append(m.toString() + ENDL + ENDL + SEPARADOR + ENDL);
		escritor.close();
	}

	/**
	 * Faz o log do email no historico
	 * 
	 * @param email
	 *            o email a ser guardado
	 * @throws IOException
	 *             caso o log do historico nao seja encontrado
	 */
	public void logEmail(MensagemTexto email) throws IOException {
		logMensagem(email, pathLog + PATH_EMAILS);
	}

	/**
	 * Faz o log do convite no historico
	 * 
	 * @param convite
	 *            o convite a ser guardado
	 * @throws IOException
	 *             caso o log do historico nao seja encontrado
	 */
	public void logConvite(Convite convite) throws IOException {
		logMensagem(convite, pathLog + PATH_CONVITES);
	}

	/**
	 * Faz o log do SMS no historico
	 * 
	 * @param sms
	 *            o SMS a ser guardado
	 * @throws IOException
	 *             caso o log do historico nao seja encontrado
	 */
	public void logSMS(SMS sms) throws IOException {
		logMensagem(sms, pathLog + PATH_SMS);
	}

	/**
	 * Reseta todos os logs do historico
	 * 
	 * @throws IOException
	 *             caso o historico nao seja encontrado
	 */
	public void reset() throws IOException {
		File[] logs = new File(pathLog).listFiles();
		File[] chats = new File(pathLog + PATH_CHATS).listFiles();

		if (logs != null)
			for (File log : logs)
				if (log.getAbsolutePath().endsWith(SUFIXO_LOG)) {
					FileWriter escritor = new FileWriter(log, false);
					escritor.write("");
					escritor.close();
				}
		if (chats != null)
			for (File chat : chats)
				if (chat.getAbsolutePath().endsWith(SUFIXO_LOG)) {
					FileWriter escritor = new FileWriter(chat, false);
					escritor.write("");
					escritor.close();
				}
	}

	/**
	 * Guarda um chat no historico do sistema
	 * 
	 * @param c
	 *            o chat a ser guardado
	 * @throws IOException
	 *             caso nao seja possivel criar o arquivo
	 */
	public void logChat(Chat c) throws IOException {
		String[] config = { c.getUsuario1().getLogin(),
				c.getUsuario2().getLogin() };
		Arrays.sort(config);
		String menor = config[0], maior = config[1];
		String pathCompleto = pathLog + PATH_CHATS
				+ (menor + "-" + maior + SUFIXO_LOG);
		File arq = new File(pathCompleto);

		if (!arq.exists()) {
			arq.createNewFile();
		}

		FileWriter escritor = new FileWriter(arq, true);
		escritor.append(c.getChat() + ENDL + ENDL);
		escritor.close();
	}

	/**
	 * Seta o novo caminho para os logs
	 * 
	 * @param path
	 *            o novo caminho para os logs
	 */
	public void setLogPath(String path) {
		pathLog = path;
	}
}